import { Module } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { utilities, WinstonModule } from 'nest-winston'
import * as winston from 'winston'
import { Console } from 'winston/lib/winston/transports'
import { LOGEnum } from '../enum/config.enum'
import { LogsController } from './logs.controller'
import { LogsService } from './logs.service'
import * as DailyRotateFile from 'winston-daily-rotate-file'
function createDailyRotateTrasnport(level: string, filename: string) {
  return new DailyRotateFile({
    //DailyRotateFile从winston-daily导入
    dirname: 'logs', //指定目录，生产的时候可以指定绝对目录
    level, //设置日志记录的级别为 info,记录 info、warn、error 级别的,但不会记录 debug 或 trace 级别的日志
    filename: `${filename}-%DATE%.log`, //文件名，%DATE%占位符用于动态地插入实际的日期，可以改为info-%DATE%.log方便分辨
    datePattern: 'YYYY-MM-DD-HH', //定义日期格式化的模式，用于文件名中插入日期的部分
    zippedArchive: true, //表示是否启用日志文件压缩。
    maxSize: '20m', //指定每个日志文件的最大大小，当文件大小超过此限制时，会自动滚动到新文件
    maxFiles: '14d', //指定日志文件保留的最大时间。这里超过14天自动删除
    format: winston.format.combine(winston.format.timestamp(), winston.format.simple())
  })
}
@Module({
  imports: [
    WinstonModule.forRootAsync({
      //异步加载
      inject: [ConfigService],
      useFactory: (configService: ConfigService) => {
        const consoleTransports = new Console({
          //console从winston/lib导入
          level: 'info',
          format: winston.format.combine(winston.format.timestamp(), utilities.format.nestLike())
        })
        //DailyRotateFile是winston的日志传输模块，用于将日志写入文件，并且支持按日期自动分割（轮转）日志文件。
        // const dailyTransports = new DailyRotateFile({
        //   //DailyRotateFile从winston-daily导入
        //   dirname: 'logs', //指定目录，生产的时候可以指定绝对目录
        //   level: 'warn', //设置日志记录的级别为 info,记录 info、warn、error 级别的,但不会记录 debug 或 trace 级别的日志
        //   filename: 'info-%DATE%.log', //文件名，%DATE%占位符用于动态地插入实际的日期，可以改为info-%DATE%.log方便分辨
        //   datePattern: 'YYYY-MM-DD-HH', //定义日期格式化的模式，用于文件名中插入日期的部分
        //   zippedArchive: true, //表示是否启用日志文件压缩。
        //   maxSize: '20m', //指定每个日志文件的最大大小，当文件大小超过此限制时，会自动滚动到新文件
        //   maxFiles: '14d', //指定日志文件保留的最大时间。这里超过14天自动删除
        //   format: winston.format.combine(winston.format.timestamp(), winston.format.simple())
        // })
        // const dailyInfoTransports = new DailyRotateFile({
        //   //DailyRotateFile从winston-daily导入
        //   dirname: 'logs', //指定目录，生产的时候可以指定绝对目录
        //   level: configService.get(LOGEnum.LOG_LEVEL), //设置日志记录的级别为 info,记录 info、warn、error 级别的,但不会记录 debug 或 trace 级别的日志
        //   filename: 'info-%DATE%.log', //文件名，%DATE%占位符用于动态地插入实际的日期，可以改为info-%DATE%.log方便分辨
        //   datePattern: 'YYYY-MM-DD-HH', //定义日期格式化的模式，用于文件名中插入日期的部分
        //   zippedArchive: true, //表示是否启用日志文件压缩。
        //   maxSize: '20m', //指定每个日志文件的最大大小，当文件大小超过此限制时，会自动滚动到新文件
        //   maxFiles: '14d', //指定日志文件保留的最大时间。这里超过14天自动删除
        //   format: winston.format.combine(winston.format.timestamp(), winston.format.simple())
        // })
        console.log(configService.get(LOGEnum.LOG_ON))

        return {
          transports: [
            consoleTransports,
            ...(configService.get(LOGEnum.LOG_ON)
              ? [
                  createDailyRotateTrasnport('info', 'application'),
                  createDailyRotateTrasnport('warn', 'errpr')
                ]
              : [])
          ]
        }
      }
    })
  ],
  controllers: [LogsController],
  providers: [LogsService]
})
export class LogsModule {}
